package com.itdfq.LeetCode.leetcode.editor.cn;
//给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中，棋盘有可能达到 board 所显示的状态时，才返回 true 。 
//
// 井字游戏的棋盘是一个 3 x 3 数组，由字符 ' '，'X' 和 'O' 组成。字符 ' ' 代表一个空位。 
//
// 以下是井字游戏的规则： 
//
// 
// 玩家轮流将字符放入空位（' '）中。 
// 玩家 1 总是放字符 'X' ，而玩家 2 总是放字符 'O' 。 
// 'X' 和 'O' 只允许放置在空位中，不允许对已放有字符的位置进行填充。 
// 当有 3 个相同（且非空）的字符填充任何行、列或对角线时，游戏结束。 
// 当所有位置非空时，也算为游戏结束。 
// 如果游戏结束，玩家不允许再放置字符。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：board = ["O  ","   ","   "]
//输出：false
//解释：玩家 1 总是放字符 "X" 。
// 
//
// 示例 2： 
//
// 
//输入：board = ["XOX"," X ","   "]
//输出：false
//解释：玩家应该轮流放字符。 
//
// 示例 3： 
//
// 
//输入：board = ["XXX","   ","OOO"]
//输出：false
// 
//
// Example 4: 
//
// 
//输入：board = ["XOX","O O","XOX"]
//输出：true
// 
//
// 
//
// 提示： 
//
// 
// board.length == 3 
// board[i].length == 3 
// board[i][j] 为 'X'、'O' 或 ' ' 
// 
// Related Topics 数组 字符串 👍 79 👎 0


import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author GodChin
 * @date 2021-12-09 16:45:23
 * @title 有效的井字游戏
 * @blog https://itdfq.com
 */
class T794_ValidTicTacToeState {




    public static void main(String[] args) {
        Solution solution = new T794_ValidTicTacToeState().new Solution();
        boolean b = solution.validTicTacToe(new String[]{"XXX","XOO","OO "});
        System.out.println(b);
    }
    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * 0 1 2
     * 3 4 5
     * 6 7 8
     */
    class Solution {
        private Character CHAR_ONE = ' ';
        private Character CHAR_TWO = 'X';
        private Character CHAR_THREE = 'O';

        public boolean validTicTacToe(String[] board) {
            List<Character> characters = new ArrayList<>();
            char[] a = board[0].toCharArray();
            char[] b = board[1].toCharArray();
            char[] c = board[2].toCharArray();
            for (int i = 0; i < 3; i++) {
                characters.add(a[i]);
            }
            for (int i = 0; i < 3; i++) {
                characters.add(b[i]);
            }
            for (int i = 0; i < 3; i++) {
                characters.add(c[i]);
            }
            int x = (int) characters.stream().filter(s -> s.equals(CHAR_TWO)).count();
            int o = (int) characters.stream().filter(s -> s.equals(CHAR_THREE)).count();
            int n = (int) characters.stream().filter(s -> s.equals(CHAR_ONE)).count();
            //如果玩家一获胜
            if (x > o) {
                return isEquae(characters, CHAR_TWO);
            }
            //如果玩家二获胜(排除都赢的局面)
            else if (x == o && x != 0) {
                if (n == 1) {
                    for (int i=0;i<characters.size();i++){
                        if (characters.get(i).equals(CHAR_ONE)){
                            characters.set(i,CHAR_TWO);
                        }
                    }
                    return isEquae(characters,CHAR_TWO);
                }
                if (isEquae(characters, CHAR_THREE) && isEquae(characters, CHAR_TWO)) {
                    return false;
                }
                return isEquae(characters, CHAR_THREE);
            } else {
                if (x == 0 && o == 0) {
                    return true;
                }
                return false;
            }
        }
        public Boolean isEquae(List<Character> characters, Character cha) {
            int a, b, c;
            a = 0;
            b = 1;
            c = 2;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            a = 3;
            b = 4;
            c = 5;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            a = 6;
            b = 7;
            c = 8;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            a = 0;
            b = 3;
            c = 6;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            a = 1;
            b = 4;
            c = 7;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            a = 2;
            b = 4;
            c = 8;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            a = 0;
            b = 4;
            c = 8;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            a = 2;
            b = 4;
            c = 6;
            if (characters.get(a).equals(characters.get(b)) && characters.get(b).equals(characters.get(c)) &&
                    characters.get(c).equals(cha)) {
                return true;
            }
            return false;

        }


    }



/*
xox
o o
xox
 */

//leetcode submit region end(Prohibit modification and deletion)

}
